/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.vng.zing.survey.controller;

import com.vng.zing.survey.thrift.client.SurveyClient;
import com.vng.zing.survey.thrift.model.AnswerItem;
import com.vng.zing.survey.thrift.model.Response;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.vng.zing.survey.model.CommonModel;
import com.vng.zing.survey.thrift.model.Error;
import com.vng.zing.survey.thrift.model.QuesType;
import com.vng.zing.survey.thrift.model.UserType;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import java.util.Map;
import org.apache.log4j.Logger;

/**
 *
 * @author namhh
 *
 * {"idUser":1,"answers":[{"type":"SINGLE_SELECTION","idQues":"1","answer":"0,0,0,1,"},{"type":"MULTI_CHOICE","idQues":"2","answer":"1,1,1,1,"},{"type":"MULTI_LINE","idQues":"3","answer":"love"}]}
 *
 */
public class AjaxSubmitResponse extends BaseController {

    private static UserType userType = UserType.USER;

    public static String checkAnswer(String type, boolean require, String value) {
        if (!require) {
            return "";
        }
        if (type.equals(QuesType.MULTI_LINE.name()) || type.equals(QuesType.SINGLE_LINE.name())) {
            if (value == null || "".equals(value)) {
                return "Hãy trả lời các câu hỏi bắt buộc!</br>";
            } else {
                return "";
            }
        } else {
            if (type.equals(QuesType.SINGLE_SELECTION.name()) || type.equals(QuesType.MULTI_CHOICE.name())) {
                String[] split = value.split(",");
                for (String string : split) {
                    if ("1".equals(string)) {
                        return "";
                    }
                }
                return "Hãy trả lời các câu hỏi bắt buộc!!</br>";
            }
        }
        return "Hãy trả lời các câu hỏi bắt buộc!</br>";
    }

    @Override
    public String render(HttpServletRequest request, HttpServletResponse resp) throws IOException, Exception {

        String error = "";
        if (request.getParameter("response") == null || request.getParameter("idSurvey") == null) {
            return CommonModel.toJSON("ERROR", "Tham số không hợp lệ!");
        }


        try {
            Map map = checkMember(request, userType);
            if (map.containsValue(ErrorType.FAIL) || map.containsValue(ErrorType.ERROR_SYSTEM)) {
                return CommonModel.toJSON("ERROR", (String) map.get("msg"));
            }
            int idUser = (int) map.get("idUser");
            int idFan = (int) map.get("msg");
            String name = (String)map.get("name");

            int idSurvey = Integer.parseInt(request.getParameter("idSurvey"));
            SurveyClient survey = SurveyClient.getInstance();
           
            
            String myJsonData = request.getParameter("response");
            JSONParser parser = new JSONParser();
            Object obj = parser.parse(myJsonData);
            JSONObject jsonObject = (JSONObject) obj;
            List<AnswerItem> answerItems = new ArrayList<AnswerItem>();

            // loop array
            JSONArray answers = (JSONArray) jsonObject.get("answers");
            int time = (int) (new Date().getTime() / 1000);
            for (Object object : answers) {

                JSONObject jsonAnswer = (JSONObject) object;
                short idQues = Short.parseShort((String) jsonAnswer.get("idQues"));
                if (idQues < 0) {
                    error += "Mã câu hỏi không hợp lệ!</br>";
                }

                String type = (String) jsonAnswer.get("type");
                if (!type.equals(QuesType.SINGLE_SELECTION.name()) && !type.equals(QuesType.MULTI_CHOICE.name()) && !type.equals(QuesType.MULTI_LINE.name()) && !type.equals(QuesType.SINGLE_LINE.name())) {
                    error += "Kiểu câu hỏi không hợp lệ!</br>";
                }

                String str_require = (String) jsonAnswer.get("require");
                boolean require = Boolean.parseBoolean(str_require);

                String answer = (String) jsonAnswer.get("answer");

                error += checkAnswer(type, require, answer);
                if (!"".equals(error)) {
                    break;
                }
                AnswerItem answerItem = new AnswerItem(QuesType.valueOf(type), idQues, answer, require, time, name);

                answerItems.add(answerItem);
            }

            if ("".equals(error)) {


                Response response = new Response(answerItems, idUser, name);
               
                Error e = survey.addResponse(idUser, idSurvey, response,idFan);
                if(e ==Error.IDUSER_ERR){
                     return CommonModel.toJSON("Thông báo", "Bạn đã trả lời khảo này rồi!");
                }
                return CommonModel.toJSON(e.name(), "Đóng ghóp của bạn đã được nghi nhận!");
            } else {

                return CommonModel.toJSON("ERROR", error);
            }
        } catch (Exception ex) {
             Logger.getLogger(this.getName()).error(ex.toString());
            return CommonModel.toJSON("ERROR", "Vui lòng thử lại sau!");

        }
    }
}
